package com.xinqi.modules.course.course.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.common.base.user.Account;
import com.xinqi.modules.course.course.dto.req.*;
import com.xinqi.modules.course.course.dto.rsp.CourseResultDTO;
import com.xinqi.modules.course.course.dto.rsp.CourseResultNewDTO;
import com.xinqi.modules.course.course.domain.CourseEntity;

import java.util.List;

/**
 * 课程表服务层
 *
 * @author: system
 * @date: 2023/01/17
 */
public interface CourseService {
    /**
     * 分页查询 课程表数据
     */
    PageInfo<CourseResultDTO> page(Param pageable, CourseQueryDTO query);

    /**
     * 查询 课程表数据
     */
    List<CourseResultDTO> find(CourseQueryDTO query);

    /**
     * 根据id查询 课程表数据
     */
    CourseResultDTO findById(Long id);

    /**
     * 根据id查询 课程表数据--变更
     */
    CourseResultNewDTO findDetailById(Long id);

    /**
     * 新增 课程表数据
     */
    Long insert(CourseCreateDTO dto);

    /**
     * 新增 课程表数据--变更
     */
    Long insertCourse(CourseCreateNewDTO dto);

    /**
     * 根据id修改 课程表数据
     */
    Boolean updateById(Account user, CourseUpdateDTO dto);

    /**
     * 根据id修改 课程表数据 -- 变更
     */
    Boolean updateCourseById(Account user, CourseUpdateNewDTO dto);

    /**
     * 根据id删除 课程表数据
     */
    Boolean deleteById(Long id);

    /**
     * 根据id删除 课程表数据
     */
    Boolean deleteById(CourseDeleteDTO dto);

    Boolean isExistsByName(String name, Long id);

    CourseResultDTO findOne(CourseQueryDTO query);

    /**
     * 课程名称是否可编辑，课程名称只能编辑一次,1-可编辑，0-不可编辑
     *
     * @param courseId 课程id
     * @return 是否可编辑
     */
    Boolean isNameEditable(Long courseId);

    /**
     * 解散课程,解散课程时，课程下
     *
     * @param courseId    课程id
     * @param classIdList 班级id列表
     * @return Boolean
     */
    Boolean dissolve(Long courseId, String smsCode, String mobile, List<Long> classIdList, Account user);

    /**
     * 课程归档 ，包括归档自己和归档全班
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean archiveAll(Long courseId);


    /**
     * 归档自己
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean archiveSelf(Long courseId);

    /**
     * 置顶课程
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean up(Long courseId);

    /**
     * 取消置顶
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean down(Long courseId);

    /**
     * 课程归档恢复自己
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean recoverSelf(Long courseId);


    /**
     * 课程归档恢复全部
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean recoverAll(Long courseId);

    /**
     * 我创建的课程归档分页列表
     *
     * @return PageInfo<CourseResultDTO>
     */
    PageInfo<CourseResultDTO> createdArchivePageList(Page<CourseEntity> page);

    /**
     * 我加入的课程归档分页列表
     *
     * @return PageInfo<CourseResultDTO>
     */
    PageInfo<CourseResultDTO> joinedArchivePageList(Page<CourseEntity> page);

    /**
     * 我加入的课程列表
     *
     * @return List<CourseResultDTO>
     */
    List<CourseResultDTO> findMyJoinedList();

    /**
     * 我创建的课程列表
     *
     * @return List<CourseResultDTO>
     */
    List<CourseResultDTO> findMyCreatedList();

    /**
     * 我创建的课程列表需要根据 课程拥有者、助教、课代表进行划分，课代表和助教只能看到他是课代表或助教的班级，也只能操作这个班级
     * 一个人只能在一个班级中担任这三个角色的其中一个
     *
     * @param courseId 课程id
     * @return CourseResultDTO
     */
    CourseResultDTO findMyCreatedById(Long courseId);

    /**
     * 我加入的课程
     *
     * @param courseId courseId 课程id
     * @return CourseResultDTO
     */
    CourseResultDTO findMyJoinedById(Long courseId);

    Boolean accountCancel(Long userId);

    CourseResultDTO findMyCreatedByClassId(Long classId);

    CourseResultDTO findMyJoinedByClassId(Long classId);

    PageInfo<CourseResultDTO> findMyJoinedPage(Param pageable);

    PageInfo<CourseResultDTO> findMyCreatedPage(Param pageable);

    /**
    * 转让课程
     */
    Boolean transfer(CourseTransferDTO dto);

    /**
     * 更新转让班级添加密码校验
     */
    Boolean transferV2(CourseTransferV2DTO dto);

    Integer updateCourseName(Long id, String courseName);

    List<CourseResultDTO> myCreatedOtherCourse(Long courseId);

    /**
     * 根据userId查询他创建的课程数量
     *
     * @param userId
     * @return
     */
    Long findCourseCountByUserId(Long userId);

    /**
     * 拷贝课程
     *
     * @param course 课程
     * @param userId 创建者id
     * @return 新的课程id
     */
    Long copy(CourseResultDTO course, Long userId);

    /**
     * 根据班级id查询课程
     *
     * @param classId 班级id
     * @return CourseResultDTO
     */
    CourseResultDTO findByClassId(Long classId);

    /**
     * 我加入的置顶
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myJoinUp(Long courseId);

    /**
     * 我创建的置顶
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myCreateUp(Long courseId);

    /**
     * 我加入的取消置顶
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myJoinDown(Long courseId);

    /**
     * 我创建的取消置顶
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myCreateDown(Long courseId);

    /**
     * 我加入的归档自己
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myJoinArchiveSelf(Long courseId);

    /**
     * 我创建的归档自己
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myCreateArchiveSelf(Long courseId);

    /**
     * 我加入的恢复归档自己
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myJoinRecoverSelf(Long courseId);

    /**
     * 我创建的恢复归档自己
     *
     * @param courseId 课程id
     * @return Boolean
     */
    Boolean myCreateRecoverSelf(Long courseId);
}
